package com.doumuxie.frame;

import com.doumuxie.dto.GoodsDto;
import com.doumuxie.dto.ProductDto;
import com.doumuxie.handler.ProductConsumeHandler;

import javax.swing.*;
import java.awt.*;
import java.util.LinkedList;
import java.util.List;

/**
 * @author doumuxie https://gitee.com/doumuxie/
 * @version 1.0
 * @date 2020/10/18 15:29
 * @description 绘制panel
 **/
public class ProductConsumePanel extends JPanel {

    /**
     * 生产者 x轴渲染位置
     */
    private int x = 50;
    /**
     * 生产者 y轴渲染位置
     */
    private int y = 200;


    /**
     * 是否展示动画
     */
    private static boolean show;

    /**
     * 小球X轴
     */
    private static int showX = 50;

    /**
     * 小球Y轴
     */
    private static int showY = 50;

    /**
     * 消费产品时的生产者下标标识
     */
    private static int showIndex = 0;


    /**
     * 重写此方法进行绘制
     *
     * @param g 画笔
     */
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        // 开始绘制生产者
        List<ProductDto> productDtoList = ProductConsumeHandler.productDtoList;
        // 遍历生产者 按顺序绘制正方形
        for (int i = 0; i < productDtoList.size(); i++) {
            g.setColor(Color.BLACK);
            g.drawRect(x + i * 100, y, 80, 80);
            // 每个生产者生产的剩余产品数量进行计数， 所有的总数不得超过仓库最大容量
            int count = 0;
            ProductDto productDto = productDtoList.get(i);
            // 产品list
            LinkedList<GoodsDto> goodsDtoLinkedList = ProductConsumeHandler.goodsDtoLinkedList;
            String productDtoId = productDto.getId();
            // 遍历产品 对应的进行渲染 生产者 - 产品
            for (int j = 0; j < goodsDtoLinkedList.size(); j++) {
                if (productDtoId.equals(goodsDtoLinkedList.get(j).getProductId())) {
                    count++;
                }
            }
            if (count == 0) {
            } else if (count <= 1 && i == showIndex && showY < 200) {
//                continue;
            } else {
                // 绘制产品
                g.setColor(Color.RED);
                g.fillOval(x + 20 + i * 100, y + 20, 40, 40);
            }
            // 是否展示移动小球， 用于生产或者消费的时候进行动画展示
            if (show) {
                g.setColor(Color.RED);
                g.fillOval(showX + 20 + showIndex * 100, showY, 40, 40);
            }
            // 绘制每个生产者剩余产品数量
            g.setColor(Color.BLACK);
            g.drawString("剩余：" + count, x + 20 + i * 100, y + 20);
        }
    }

    /**
     * 单独线程更新移动小球的坐标
     *
     * @param type  1 入队。生产 2 出队。消费
     * @param index 生产者索引
     */
    public static void drawMoveOval(int type, int index) {
        System.err.println(type + "---" + index);
        showIndex = index;
        new Thread(new Runnable() {
            @Override
            public void run() {
                if (type == 1) {
                    showY = 50;
                } else {
                    showY = 200;
                }
                show = true;
                while (showY < (type == 1 ? 200 : 350)) {
                    showY++;
                    try {
                        Thread.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                if (type == 1) {
                    showY = 50;
                } else {
                    showY = 200;
                }
                show = false;
                showIndex = -1;
            }
        }).start();
    }


    /**
     * 绘制生产者
     */
    public void drawProduct() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 单独线程 每20 ms 重绘一次面板
                while (true) {
                    repaint();
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}
